home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / chrome / comm.jar / content / xbl-marquee / xbl-marquee.xml < prev   
Extensible Markup Language  |  2006-02-28  |  14KB  |  406 lines

  1. <?xml version="1.0"?>
  2. <!-- ***** BEGIN LICENSE BLOCK *****
  3.    - Version: MPL 1.1/GPL 2.0/LGPL 2.1
  4.    -
  5.    - The contents of this file are subject to the Mozilla Public License Version
  6.    - 1.1 (the "License"); you may not use this file except in compliance with
  7.    - the License. You may obtain a copy of the License at
  8.    - http://www.mozilla.org/MPL/
  9.    -
  10.    - Software distributed under the License is distributed on an "AS IS" basis,
  11.    - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12.    - for the specific language governing rights and limitations under the
  13.    - License.
  14.    -
  15.    - The Original Code is Netscape's XBL Marquee Emulation code.
  16.    -
  17.    - The Initial Developer of the Original Code is
  18.    - Netscape Communications Corporation.
  19.    - Portions created by the Initial Developer are Copyright (C) 2002
  20.    - the Initial Developer. All Rights Reserved.
  21.    -
  22.    - Contributor(s):
  23.    -   Doron Rosenberg <doron@netscape.com>
  24.    -   L. David Baron <dbaron@dbaron.org>
  25.    -
  26.    - Alternatively, the contents of this file may be used under the terms of
  27.    - either the GNU General Public License Version 2 or later (the "GPL"), or
  28.    - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  29.    - in which case the provisions of the GPL or the LGPL are applicable instead
  30.    - of those above. If you wish to allow use of your version of this file only
  31.    - under the terms of either the GPL or the LGPL, and not to allow others to
  32.    - use your version of this file under the terms of the MPL, indicate your
  33.    - decision by deleting the provisions above and replace them with the notice
  34.    - and other provisions required by the LGPL or the GPL. If you do not delete
  35.    - the provisions above, a recipient may use your version of this file under
  36.    - the terms of any one of the MPL, the GPL or the LGPL.
  37.    -
  38.    - ***** END LICENSE BLOCK ***** -->
  39.  
  40. <bindings id="marqueeBindings"
  41.           xmlns="http://www.mozilla.org/xbl"
  42.           xmlns:html="http://www.w3.org/1999/xhtml"
  43.           xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  44.           xmlns:xbl="http://www.mozilla.org/xbl">
  45.  
  46.  
  47.   <binding id="marquee" inheritstyle="false">
  48.  
  49.     <resources>
  50.       <stylesheet src="chrome://xbl-marquee/content/xbl-marquee.css"/>
  51.     </resources>
  52.     <implementation>
  53.  
  54.       <field name="defaultScrollAmount">6</field>
  55.       <property name="scrollAmount">
  56.         <getter>
  57.           if (this.hasAttribute("scrollamount"))
  58.             return this.getAttribute("scrollamount");
  59.           return this.defaultScrollAmount; //default value is 6 pixels
  60.         </getter>
  61.         <setter>
  62.           this.setAttribute("scrollamount", val);
  63.         </setter>
  64.       </property>
  65.  
  66.       <field name="defaultScrollDelay">85</field>
  67.       <property name="scrollDelay">
  68.         <getter>
  69.           <![CDATA[
  70.           var rv = this.defaultScrollDelay; //default value is 85 ms
  71.  
  72.           if (this.hasAttribute("scrolldelay")) {
  73.             rv = this.getAttribute("scrolldelay");
  74.  
  75.             //marquee doesn't allow anything shorter than 40 ms
  76.             if (rv < 40)
  77.               rv = 40;
  78.           }
  79.           return rv;
  80.           ]]>
  81.         </getter>
  82.         <setter>
  83.           this.setAttribute("scrolldelay", val);
  84.  
  85.           // since we changed the scrolldelay, restart the marquee
  86.           this._doMove(false);
  87.         </setter>
  88.       </property>
  89.  
  90.       <field name="defaultDirection">"left"</field>
  91.       <property name="direction">
  92.         <getter>
  93.           return this.directionField;
  94.         </getter>
  95.         <setter>
  96.           // if val is false, don't change anything
  97.           if (val) {
  98.             // in case direction is swapped between horizontal/vertical, use
  99.             // setAttribute to make the xbl bindings change.
  100.             this.setAttribute("direction", val);
  101.  
  102.             // since we changed the direction, set startNewDirection to true
  103.             this.startNewDirection = true;
  104.             this.directionField = val.toLowerCase();
  105.  
  106.             // pass in aSkipSettingNewPosition as true
  107.             this._doMove(true);
  108.           }
  109.         </setter>
  110.       </property>
  111.  
  112.       <field name="directionField">"left"</field>
  113.  
  114.       <field name="defaultBehavior">"scroll"</field>
  115.       <property name="behavior">
  116.         <getter>
  117.           return this.behaviorField;
  118.         </getter>
  119.         <setter>
  120.           this.behaviorField = val ? val.toLowerCase() : this.defaultBehavior;
  121.         </setter>
  122.       </property>
  123.  
  124.       <field name="behaviorField">"scroll"</field>
  125.  
  126.       <field name="dirsign">1</field>
  127.       <field name="startAt">0</field>
  128.       <field name="stopAt">0</field>
  129.       <field name="newPosition">0</field>
  130.       <field name="runId">0</field>
  131.  
  132.       <field name="originalHeight">0</field>
  133.       <field name="startNewDirection">true</field>
  134.  
  135.       <property name="outerDiv"
  136.         onget="return document.getAnonymousNodes(this)[0]"
  137.       />
  138.  
  139.       <property name="innerDiv"
  140.         onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'innerDiv');"
  141.       />
  142.  
  143.       <property name="height"
  144.         onget="return this.getAttribute('height');"
  145.       />
  146.  
  147.       <property name="width">
  148.         <getter>
  149.           <![CDATA[
  150.           var rv = "1px";
  151.           if (this.hasAttribute("width"))
  152.             rv = this.getAttribute("width");
  153.           else if (this.offsetWidth) {
  154.             // if the element has an offsetWidth, don't set a width
  155.             rv = "";
  156.           } else if (this.offsetParent) {
  157.             var myElem = this.offsetParent;
  158.  
  159.             // lets walk up the offsetParent tree looking for an
  160.             // element with a width.
  161.  
  162.             while (myElem.offsetParent && (myElem.offsetWidth <= 0))
  163.               myElem = myElem.offsetParent;
  164.  
  165.             if (myElem)
  166.               rv = myElem.offsetWidth + "px";
  167.           }
  168.  
  169.           return rv;
  170.           ]]>
  171.         </getter>
  172.       </property>
  173.  
  174.       <!-- For sniffing purposes -->
  175.       <field name="nsMarqueeVersion">"0.9.7"</field>
  176.  
  177.       <method name="start">
  178.         <body>
  179.         <![CDATA[
  180.           this._doMove(false);
  181.         ]]>
  182.         </body>
  183.       </method>
  184.  
  185.       <method name="stop">
  186.         <body>
  187.         <![CDATA[
  188.           if (this.runId != 0)
  189.             clearTimeout(this.runId);
  190.  
  191.           this.runId = 0;
  192.         ]]>
  193.         </body>
  194.       </method>
  195.  
  196.       <method name="_doMove">
  197.         <parameter name="aSkipSettingNewPosition"/>
  198.         <body>
  199.         <![CDATA[
  200.  
  201.           this.stop();
  202.  
  203.           //startNewDirection is true at first load and whenever the direction is changed
  204.           if (this.startNewDirection) {
  205.             this.startNewDirection = false; //we only want this to run once every scroll direction change
  206.  
  207.             if ((this.directionField == "up") || (this.directionField == "down"))
  208.             {
  209.               // "", 0 and empty height should default to 200px
  210.               var height =
  211.                 (this.getAttribute("height") != "0" &&
  212.                  this.getAttribute("height")) ||
  213.                 (document.defaultView.getComputedStyle(this,"").height != "0px" &&
  214.                  document.defaultView.getComputedStyle(this,"").height) ||
  215.                  "200px";
  216.  
  217.               // support % heights
  218.               if (/%/.test(height)) {
  219.                 height = parseInt('0' + height, 10);
  220.                 height = (height/100) * this.outerDiv.offsetHeight;
  221.               }
  222.  
  223.               this.outerDiv.style.height = height;
  224.  
  225.               this.innerDiv.style.padding = height + " 0";
  226.               this.innerDiv.style.whiteSpace = "";
  227.             }
  228.             else {
  229.               this.outerDiv.style.height = "";
  230.  
  231.               this.innerDiv.style.padding = "0px";
  232.               this.innerDiv.style.whiteSpace = "nowrap";
  233.             }
  234.  
  235.             switch (this.directionField)
  236.             {
  237.               case "up":
  238.                 this.dirsign = 1;
  239.                 this.startAt = (this.behaviorField == 'alternate') ? this.originalHeight : 0;
  240.                 this.stopAt  = this.innerDiv.offsetHeight - parseInt(this.outerDiv.style.height) 
  241.                                - ((this.behaviorField == 'alternate') ? this.originalHeight : 0);               
  242.               break;
  243.  
  244.               case "down":
  245.                 this.dirsign = -1;
  246.                 this.startAt = this.innerDiv.offsetHeight - parseInt(this.outerDiv.style.height)
  247.                                - ((this.behaviorField == 'alternate') ? this.originalHeight : 0);
  248.                 this.stopAt  = (this.behaviorField == 'alternate') ? this.originalHeight : 0;
  249.               break;
  250.  
  251.               case "right":
  252.                 this.dirsign = -1;
  253.                 this.stopAt  = (this.behaviorField != 'alternate') ? this.innerDiv.offsetLeft - this.outerDiv.offsetWidth : this.innerDiv.offsetWidth;
  254.                 this.startAt = this.outerDiv.offsetWidth 
  255.                                + ((this.behaviorField != 'alternate') ? (this.innerDiv.offsetWidth + this.stopAt) : 0);   
  256.               break;
  257.  
  258.               case "left":
  259.               default:
  260.                 this.dirsign = 1;
  261.                 this.startAt = (this.behaviorField != 'alternate') ? (this.innerDiv.offsetLeft - this.outerDiv.offsetWidth) : this.innerDiv.offsetWidth;
  262.                 this.stopAt  = this.outerDiv.offsetWidth
  263.                                + ((this.behaviorField != 'alternate') ? (this.innerDiv.offsetWidth + this.startAt) : 0);
  264.             }
  265.  
  266.             // if the direction attribute is changed, don't reset the starting position
  267.             if (!aSkipSettingNewPosition)
  268.               this.newPosition = this.startAt;
  269.           } //end if
  270.  
  271.           this.newPosition = parseInt(this.newPosition) + (this.dirsign * this.scrollAmount);
  272.  
  273.           if ((this.dirsign == 1 && this.newPosition > this.stopAt) ||
  274.               (this.dirsign == -1 && this.newPosition < this.stopAt))
  275.           {
  276.             if (this.behaviorField == "alternate")
  277.             {
  278.               // lets start afresh
  279.               this.startNewDirection = true;
  280.  
  281.               // swap direction
  282.               const swap = {left: "right", down: "up", up: "down", right: "left"};
  283.               this.directionField = swap[this.directionField];
  284.             }
  285.             else
  286.             {
  287.               this.newPosition = this.startAt;
  288.             }
  289.           }
  290.  
  291.           if (!this.startNewDirection) {
  292.             if ((this.directionField == "up") || (this.directionField == "down"))
  293.               this.outerDiv.scrollTop = this.newPosition;
  294.             else
  295.               this.outerDiv.scrollLeft = this.newPosition;
  296.           }
  297.  
  298.           var myThis = this;
  299.  
  300.           var lambda = function myTimeOutFunction(){myThis.start();}
  301.           this.runId = window.setTimeout(lambda, this.scrollDelay);
  302.         ]]>
  303.         </body>
  304.       </method>
  305.  
  306.       <method name="init">
  307.         <body>
  308.         <![CDATA[
  309.           var height;
  310.  
  311.           if (this.hasAttribute('height')) {
  312.             height = this.getAttribute('height');
  313.             this.outerDiv.style.height = height + "px";
  314.           }
  315.  
  316.           this.outerDiv.style.width = this.width;
  317.  
  318.           // Some sites access the element via the evil IE way of elementID.foo()
  319.           if (this.hasAttribute('id'))
  320.             window[this.getAttribute('id')] = this;
  321.  
  322.           // Website can define a background color via the bgcolor attribute
  323.           if (this.hasAttribute("bgcolor"))
  324.             this.outerDiv.style.backgroundColor = this.getAttribute("bgcolor");
  325.  
  326.           // store the original height before we add padding
  327.           this.originalHeight = this.innerDiv.offsetHeight;
  328.  
  329.           this._doMove(false);
  330.         ]]>
  331.         </body>
  332.       </method>
  333.  
  334.       <constructor>
  335.         <![CDATA[
  336.           // for performance, we store the lowercased direction/behavior in a field.
  337.           // default to "left"
  338.           this.directionField = this.hasAttribute("direction") ? this.getAttribute("direction").toLowerCase() : this.defaultDirection;
  339.           
  340.           // default to "scroll"
  341.           this.behaviorField = this.hasAttribute("behavior") ? this.getAttribute("behavior").toLowerCase() : this.defaultBehavior;
  342.  
  343.           var myThis = this;
  344.           var lambda = function myScopeFunction() { myThis.init(); }
  345.  
  346.           // init needs to be run after the page has loaded in order to calculate
  347.           // the correct height/width
  348.           window.addEventListener("load", lambda, false);
  349.         ]]>
  350.       </constructor>
  351.     </implementation>
  352.     
  353.     <handlers>
  354.       <handler event="DOMAttrModified" phase="target">
  355.         <![CDATA[
  356.         var attrName = event.attrName.toLowerCase();
  357.         var oldValue = event.prevValue.toLowerCase();
  358.         var newValue = event.newValue.toLowerCase();
  359.  
  360.         // only if a new value is specified
  361.         if (oldValue != newValue && newValue) {
  362.           if (attrName == "direction") {
  363.             this.startNewDirection = true;
  364.             this.directionField = newValue;
  365.             this._doMove(true);
  366.           } else if (attrName == "behavior") {
  367.             this.behaviorField = newValue;
  368.           }
  369.         }
  370.         ]]>
  371.       </handler>
  372.     </handlers>
  373.  
  374.   </binding>
  375.  
  376.   <binding id="marquee-horizontal"
  377.            extends="chrome://xbl-marquee/content/xbl-marquee.xml#marquee"
  378.            inheritstyle="false">
  379.  
  380.     <content>
  381.       <html:div xbl:inherits="" style="overflow: -moz-scrollbars-none">
  382.         <xul:hbox style="margin: 0 100%; -moz-user-select: text;">
  383.           <html:div anonid="innerDiv">
  384.             <children/>
  385.           </html:div>
  386.         </xul:hbox>
  387.       </html:div>
  388.     </content>
  389.  
  390.   </binding>
  391.  
  392.   <binding id="marquee-vertical"
  393.            extends="chrome://xbl-marquee/content/xbl-marquee.xml#marquee">
  394.  
  395.     <content>
  396.       <html:div xbl:inherits="" style="overflow: -moz-scrollbars-none">
  397.         <html:div anonid="innerDiv">
  398.           <children/>
  399.         </html:div>
  400.       </html:div>
  401.     </content>
  402.  
  403.   </binding>
  404.  
  405. </bindings>
  406.